
// import uvm_pkg::*;

// `include "uvm_macros.svh"



// class eht_arp_top_driver extends uvm_driver;
//     //virtual eht_mac_tx_intf intf;
//     `uvm_component_utils(eht_arp_top_driver)

//     // virtual axi_stream_if vif;

//     function new(string name = "eht_arp_top_driver", uvm_component parent = null);
//         super.new(name, parent);
//         `uvm_info("eht_arp_top_driver","new is called",UVM_LOW)
//     endfunction

//     function void build_phase(uvm_phase phase);
//         super.build_phase(phase);
//         `uvm_info("eht_arp_top_driver","build_phase is called",UVM_LOW)
//         // if(!uvm_config_db# (virtual axi_stream_if )::get(this, "", "vif",vif))
//         //     `uvm_fatal("eht_arp_top_driver", "virtual axi_stream_if must be set for vif!!!")
        
//     endfunction


//     task main_phase(uvm_phase phase);
//         //object maismch,if there is not raise,the task finish immdately
//         phase.raise_objection(this);
//         `uvm_info("eht_arp_top_driver","main_phase is called",UVM_LOW)
//         #10us;
//         phase.drop_objection(this);
//     endtask

//     // task arp_tx_pakage(logic [15:0] len);
        
    
//     // endtask

// endclass




// module tb_ethernet_arp_top;

//     logic           clk                     ;
//     logic           rst                     ;

//     //arp
//     logic   arp_tx_broadcast    ;
//     logic  [31:0] arp_axis_tx_user    ;
//     logic  [7:0] arp_axis_tx_data    ;
//     logic   arp_axis_tx_last    ;
//     logic   arp_axis_tx_valid   ;
//     logic   arp_axis_tx_ready   ;

//     logic   [7:0]gmii_txdata     ; 
//     logic   gmii_txvalid    ;  
//     logic   [7:0]gmii_rxdata     ; 
//     logic   gmii_rxvalid    ;  

//     logic   [47:0]set_target_mac;
//     logic   set_target_mac_valid;

//     //mac
//     logic   mac_rx_is_broadcast;
//     logic   mac_tx_is_broadcast;
//     logic   [31:0] mac_axis_tx_user  ;
//     logic   [7:0]mac_axis_tx_data  ;
//     logic   mac_axis_tx_last  ;
//     logic   mac_axis_tx_valid ;
//     logic   mac_axis_tx_ready ;

//     logic   [31:0] mac_axis_rx_user  ;
//     logic   [7:0]mac_axis_rx_data  ;
//     logic   mac_axis_rx_last  ;
//     logic   mac_axis_rx_valid ;

//     // axi_stream_if axis_tx_if(clk,rst);




//     assign gmii_rxvalid = gmii_txvalid;
//     assign gmii_rxdata = gmii_txdata;

//     ethernet_arp_top #(
//       .SOURCE_MAC ( 48'h01_02_03_04_05_06),
//       .SOURCE_IP  ( {8'd192,8'd168,8'd100,8'd100}),
//       .TARGET_IP  ( {8'd192,8'd168,8'd100,8'd99})
//     )dut2(
//       .i_clk                   ( clk                      ),
//       .i_rst                   ( rst                      ),
//       .i_set_source_ip         ( 0),
//       .i_set_source_ip_valid   ( 0),
//       .i_set_target_ip         ( 0),
//       .i_set_target_ip_valid   ( 0),
//       .i_set_source_mac        ( 0),
//       .i_set_source_mac_valid  ( 0),
      
//       .o_tx_is_broadcast       ( arp_tx_broadcast           ),
//       .o_axis_tx_user          ( arp_axis_tx_user           ),
//       .o_axis_tx_data          ( arp_axis_tx_data           ),
//       .o_axis_tx_last          ( arp_axis_tx_last           ),
//       .o_axis_tx_valid         ( arp_axis_tx_valid          ),
//       .i_axis_tx_ready         ( arp_axis_tx_ready          ),

//       .i_rx_is_broadcast       ( mac_rx_is_broadcast        ),
//       .i_axis_rx_user          ( mac_axis_rx_user           ),
//       .i_axis_rx_data          ( mac_axis_rx_data           ),
//       .i_axis_rx_last          ( mac_axis_rx_last           ),
//       .i_axis_rx_valid         ( mac_axis_rx_valid          ),
//       .o_set_target_mac        ( set_target_mac             ),
//       .o_set_target_mac_valid  ( set_target_mac_valid       )   
//    );

//    arbiter2to1 dut1(
//       .i_clk                     ( clk),
//       .i_rst                     ( rst),
//       .i_tx1_is_broadcast        ( arp_tx_broadcast             ),
//       .i_axis_tx1_user           ( arp_axis_tx_user             ),
//       .i_axis_tx1_data           ( arp_axis_tx_data             ),
//       .i_axis_tx1_last           ( arp_axis_tx_last             ),
//       .i_axis_tx1_valid          ( arp_axis_tx_valid            ),
//       .o_axis_tx1_ready          ( arp_axis_tx_ready            ),
      

//       .i_tx2_is_broadcast        ( 0),
//       .i_axis_tx2_user           ( 0),
//       .i_axis_tx2_data           ( 0),
//       .i_axis_tx2_last           ( 0),
//       .i_axis_tx2_valid          ( 0),
//       .o_axis_tx2_ready          (  ),
      
//       .o_tx_is_broadcast         ( mac_tx_is_broadcast          ),
//       .o_axis_tx_user            ( mac_axis_tx_user             ),
//       .o_axis_tx_data            ( mac_axis_tx_data             ),
//       .o_axis_tx_last            ( mac_axis_tx_last             ),
//       .o_axis_tx_valid           ( mac_axis_tx_valid            ),
//       .i_axis_tx_ready           ( mac_axis_tx_ready            )
//    );

//     ethernet_mac_top #(
//       .TARGET_MAC                ( 48'hff_ff_ff_ff_ff_ff    ),
//       .SOURCE_MAC                ( 48'h01_02_03_04_05_06    ),
//       .CRC_ON                    ( 1                        )      
//     )dut0(
//       .i_clk                     ( clk                      ),
//       .i_rst                     ( rst                      ),
//       .i_set_target_mac          ( set_target_mac           ),
//       .i_set_target_mac_valid    ( set_target_mac_valid     ),
//       .i_set_source_mac          ( 0),
//       .i_set_source_mac_valid    ( 0),
//       .o_rx_is_broadcast         ( mac_rx_is_broadcast      ),
//       .o_axis_rx_user            ( mac_axis_rx_user         ),
//       .o_axis_rx_data            ( mac_axis_rx_data         ),
//       .o_axis_rx_last            ( mac_axis_rx_last         ),
//       .o_axis_rx_valid           ( mac_axis_rx_valid        ),

//       .i_tx_is_broadcast         ( mac_tx_is_broadcast      ),
//       .i_axis_tx_user            ( mac_axis_tx_user         ),
//       .i_axis_tx_data            ( mac_axis_tx_data         ),
//       .i_axis_tx_last            ( mac_axis_tx_last         ),
//       .i_axis_tx_valid           ( mac_axis_tx_valid        ),
//       .o_axis_tx_ready           ( mac_axis_tx_ready        ),
//       .i_gmii_rxdata             ( gmii_rxdata              ),
//       .i_gmii_rxvalid            ( gmii_rxvalid             ),
//       .o_gmii_txdata             ( gmii_txdata              ),
//       .o_gmii_txvalid            ( gmii_txvalid             )
//    );  
  
//     initial begin
//         clk <= 0;
//         forever begin
//             #4ns;
//             clk <= ~clk;
//         end
//     end

//     initial begin
//         rst <= 1;
//         #100ns;
//         @(posedge clk)
//         #1ns;
//         rst <= 0;
//     end



//     initial begin
//         // uvm_config_db# (virtual axi_stream_if )::set(null, "uvm_test_top","vif",axis_tx_if);
//         run_test("eht_arp_top_driver");
//     end

// endmodule